/*
 * global.cpp
 *
 *  Created on: 16.06.2013
 *      Author: SpirTanol
 */

#include "global.h"

// QT
#include <QString>
#include <QComboBox>

// OS
#include <windows.h>

// modbus
#include "modbus.h"

// STD
#include <vector>
#include <algorithm>
//=========================================================================================
extern const QString cgGreenColor = "background-color: #00CC00;color: #000000;border: 1px solid #000000;";
extern const QString cgRedColor = "background-color: #FF3300;color: #000000;border: 1px solid #000000;";
extern const QString cgOrangeColor = "background-color: #FFCC00;color: #000000;border: 1px solid #000000;";
extern const QString cgDefColor = "border: 1px solid #000000;";
//=========================================================================================
extern const QString cgProgressStyle = QString::fromUtf8(
	"QProgressBar:horizontal{\n"
	"border: 1px solid gray;\n"
	"border-radius: 5px;\n"
	"background: white;\n"
	"padding: 1px;\n"
	"}\n\n"
	"QProgressBar::chunk:horizontal \n"
	"{\n"
	"background: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1, stop: 0 #CCFFCC, stop: 0.5 #66CC66, stop: 1 #CCFFCC);\n"
"}");

extern const int gFormats[] =
{
	ModbusPort::_8E1,
	ModbusPort::_8O1,
	ModbusPort::_8N15
};
//=========================================================================================
double max(const QVector <double>&mas)
{
	if(mas.count() == 0)
		return 0;
	double dMax = mas[0];
	for(int i = 1;i < mas.count();i++)
	{
		if(dMax < mas[i])
			dMax = mas[i];
	}
	return dMax;
}

double min(const QVector <double>&mas)
{
	if(mas.count() == 0)
		return 0;
	double dMin = mas[0];
	for(int i = 1; i < mas.count(); i++)
	{
		if(dMin > mas[i])
			dMin = mas[i];
	}
	return dMin;
}
//=========================================================================================
int getTimeout(int speed)
{
	if(speed < CBR_2400)
			return 800;
	if(speed < CBR_38400)
		return 400;
	return 300;
}
//=========================================================================================
void fillComboPort(QComboBox *comboBox, int current)
{
	char *devices = new char[65535];
	char *pDev;

	std::vector<int> ports;
	bool res = QueryDosDeviceA(0, devices, 65535);
	if(res)
	{
		for(int i = 0; devices[i]; ++i)
		{
			pDev = &devices[i];
			if(strlen(pDev) > 3 && !strncmp(pDev, "COM", 3))
			{
				int num = QString(pDev + 3).toInt();
				ports.push_back(num);
			}
			while(devices[i]) ++i;
		}
	}
	delete devices;
	std::sort(ports.begin(), ports.end());

	for (std::vector<int>::iterator it = ports.begin();
			it != ports.end(); ++it)
	{
		comboBox->addItem(QString::fromUtf8("COM") + QString::number(*it), *it);
		if (*it == current)
			comboBox->setCurrentIndex(comboBox->count() - 1);
	}
}

void fillComboSpeed(QComboBox *comboBox)
{
	static const int speeds[] = {CBR_600, CBR_1200, CBR_2400, CBR_4800, CBR_9600, CBR_14400, CBR_19200, CBR_38400, CBR_57600};

	for (int i = 0; i < 9; ++i)
		comboBox->addItem(QString::number(speeds[i]), speeds[i]);
}

void fillComboFormat(QComboBox *comboBox)
{
	static const char *formats[] = {"8E1", "8O1", "8N15"};

	for (int i = 0; i < 3; ++i)
		comboBox->addItem(formats[i], gFormats[i]);
}

void fillComboAddr(QComboBox *comboBox)
{
	for (int i = 1; i <= 247; ++i)
		comboBox->addItem(QString::number(i), i);
}
//=========================================================================================
QString crashText(int code)
{
	switch (code)
	{
	case CC_CURRENT_IMBALANCE: return QString::fromUtf8("Перекос токов фаз");
	case CC_PHASE_CRASH: return QString::fromUtf8("Обрыв одной или двух фаз, холостой ход двигателя");
	case CC_SHORT_CIRCUIT: return QString::fromUtf8("Короткое замыкание (быстродействующая защита)");
	case CC_CUR_OVERLOAD: return QString::fromUtf8("Перегрузка по току (среднебыстродействующая защита)");
	case CC_TEMP_OVERLOAD: return QString::fromUtf8("Тепловая перегрузка двигателя");
	case CC_INSULATION_FAILURE: return QString::fromUtf8("Нарушение изоляции обмоток двигателя");
	case CC_VOL_OUT_OF_RANGE: return QString::fromUtf8("Выход напряжения сети за установленные границы");
	case CC_OUT_OF_SEQUENCE: return QString::fromUtf8("Нарушение последовательности фаз");
	case CC_CRASH_RTS: return QString::fromUtf8("Обрыв термодатчика РТС");
	case CC_CIRCUIT_RTS: return QString::fromUtf8("Замыкание термодатчика РТС");
	case CC_TEMP_OVERLOAD_RTS: return QString::fromUtf8("Перегрев двигателя (по термодатчику PTC)");
	case CC_CRASH_RT100: return QString::fromUtf8("Обрыв термодатчика PT100");
	case CC_CIRCUIT_RT100: return QString::fromUtf8("Замыкание термодатчика PT100");
	case CC_TEMP_OVERLOAD_RT100: return QString::fromUtf8("Перегрев двигателя (по термодатчику PT100)");
	case CC_CRASH_WET: return QString::fromUtf8("Обрыв датчика влажности");
	case CC_WATER_PENETRATION: return QString::fromUtf8("Попадание воды в картер насоса");
	case CC_EXTERNAL_CRASH_IN1: return QString::fromUtf8("Внешняя авария вход 1");
	case CC_EXTERNAL_CRASH_IN2: return QString::fromUtf8("Внешняя авария вход 2");
	}

	return QString();
}
